/*!
 * \file WtHelper.h
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief 助手函数头文件
 * 
 * WtHelper是WonderTrader系统中的工具类，提供了一系列静态方法
 * 用于处理系统路径、时间管理和目录操作等通用功能，主要包括：
 * 1. 工作目录和模块路径的获取
 * 2. 系统时间和交易日期的管理
 * 3. 各种数据目录的创建和访问
 * 4. 实例目录和生成目录的配置
 * 
 * 该类为整个系统提供基础的工具支持。
 */
#pragma once
#include <string>
#include <stdint.h>

/**
 * @class WtHelper
 * @brief 助手工具类
 * 
 * WtHelper提供了WonderTrader系统中常用的工具函数：
 * 1. 路径管理：获取当前工作目录、模块路径等
 * 2. 时间管理：设置和获取当前日期、时间、交易日等
 * 3. 目录管理：创建和获取各种数据存储目录
 * 4. 配置管理：设置实例目录和生成目录
 * 
 * 所有方法都是静态方法，可以直接通过类名调用。
 */
class WtHelper
{
public:
	/**
	 * @brief 获取当前工作目录
	 * @return 当前工作目录的标准化路径
	 * 
	 * 获取程序运行时的当前工作目录，并进行路径标准化处理
	 */
	static std::string getCWD();

	/**
	 * @brief 获取模块路径
	 * @param moduleName 模块名称
	 * @param subDir 子目录名称
	 * @param isCWD 是否基于当前工作目录，默认为true
	 * @return 完整的模块路径
	 * 
	 * 根据模块名称和子目录构建完整的模块路径
	 */
	static std::string getModulePath(const char* moduleName, const char* subDir, bool isCWD = true);

	/**
	 * @brief 获取基础目录
	 * @return 基础目录路径
	 * 
	 * 获取系统的基础生成目录，如果不存在则自动创建
	 */
	static const char* getBaseDir();
	
	/**
	 * @brief 获取输出目录
	 * @return 输出目录路径
	 * 
	 * 获取系统的输出目录，用于存放各种输出文件，如果不存在则自动创建
	 */
	static const char* getOutputDir();
	
	/**
	 * @brief 获取策略数据目录
	 * @return 策略数据目录路径
	 * 
	 * 获取策略数据存储目录，如果不存在则自动创建
	 */
	static const char* getStraDataDir();
	
	/**
	 * @brief 获取策略用户数据目录
	 * @return 策略用户数据目录路径
	 * 
	 * 获取策略用户数据存储目录，如果不存在则自动创建
	 */
	static const char* getStraUsrDatDir();

	/**
	 * @brief 获取组合目录
	 * @return 组合目录路径
	 * 
	 * 获取投资组合数据存储目录，如果不存在则自动创建
	 */
	static const char* getPortifolioDir();

	/**
	 * @brief 设置当前时间
	 * @param date 日期（格式：YYYYMMDD）
	 * @param time 时间（格式：HHMM）
	 * @param secs 秒数，默认为0
	 * 
	 * 设置系统的当前日期、时间和秒数
	 */
	static inline void setTime(uint32_t date, uint32_t time, uint32_t secs = 0)
	{
		_cur_date = date;
		_cur_time = time;
		_cur_secs = secs;
	}

	/**
	 * @brief 设置交易日期
	 * @param tDate 交易日期（格式：YYYYMMDD）
	 * 
	 * 设置当前的交易日期
	 */
	static inline void setTDate(uint32_t tDate){ _cur_tdate = tDate; }

	/**
	 * @brief 获取当前日期
	 * @return 当前日期（格式：YYYYMMDD）
	 */
	static inline uint32_t getDate(){ return _cur_date; }
	
	/**
	 * @brief 获取当前时间
	 * @return 当前时间（格式：HHMM）
	 */
	static inline uint32_t getTime(){ return _cur_time; }
	
	/**
	 * @brief 获取当前秒数
	 * @return 当前秒数
	 */
	static inline uint32_t getSecs(){ return _cur_secs; }
	
	/**
	 * @brief 获取交易日期
	 * @return 交易日期（格式：YYYYMMDD）
	 */
	static inline uint32_t getTradingDate(){ return _cur_tdate; }

	/**
	 * @brief 获取实例目录
	 * @return 实例目录引用
	 * 
	 * 获取系统实例安装目录的引用
	 */
	static const std::string& getInstDir() { return _inst_dir; }
	
	/**
	 * @brief 设置实例目录
	 * @param inst_dir 实例目录路径
	 * 
	 * 设置系统实例安装目录
	 */
	static void setInstDir(const char* inst_dir){ _inst_dir = inst_dir; }

	/**
	 * @brief 设置生成目录
	 * @param gen_dir 生成目录路径
	 * 
	 * 设置系统数据生成目录
	 */
	static void setGenerateDir(const char* gen_dir) { _gen_dir = gen_dir; }

private:
	static uint32_t		_cur_date;	///< 当前日期
	static uint32_t		_cur_time;	///< 当前时间，以分钟为准
	static uint32_t		_cur_secs;	///< 当前秒数，精确到秒
	static uint32_t		_cur_tdate;	///< 当前交易日
	static std::string	_inst_dir;	///< 实例安装目录
	static std::string	_gen_dir;	///< 数据生成目录
};

